Make sure version env vars are always present
authorAlex Crichton <alex@alexcrichton.com>
Thu, 7 Aug 2014 15:42:16 +0000 (08:42 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 8 Aug 2014 03:24:48 +0000 (20:24 -0700)
They were accidentally left out of the `rustdoc --test` stage which caused
crates not to be able to be compiled.

src/cargo/ops/cargo_rustc/compilation.rs
src/cargo/ops/cargo_rustc/context.rs
src/cargo/ops/cargo_rustc/mod.rs
src/snapshots.txt
tests/test_cargo_compile.rs

index 4af3050cb366674b3db9cdbe8ff244818963b199..6a1a740bb9377a291dcaa01f554545d12d28e01d 100644 (file)
@@ -30,6 +30,10 @@ pub struct Compilation {
 
     /// Output directory for rust dependencies
     pub deps_output: Path,
+
+    /// Extra environment variables that were passed to compilations and should
+    /// be passed to future invocations of programs.
+    pub extra_env: HashMap<String, Option<String>>,
 }
 
 impl Compilation {
@@ -41,6 +45,7 @@ impl Compilation {
             deps_output: Path::new("/"),
             tests: Vec::new(),
             binaries: Vec::new(),
+            extra_env: HashMap::new(),
         }
     }
 
@@ -54,7 +59,11 @@ impl Compilation {
         search_path.push(self.root_output.clone());
         search_path.push(self.deps_output.clone());
         let search_path = os::join_paths(search_path.as_slice()).unwrap();
-        util::process(cmd).env(DynamicLibrary::envvar(),
-                               Some(search_path.as_slice()))
+        let mut cmd = util::process(cmd).env(DynamicLibrary::envvar(),
+                                             Some(search_path.as_slice()));
+        for (k, v) in self.extra_env.iter() {
+            cmd = cmd.env(k.as_slice(), v.as_ref().map(|s| s.as_slice()));
+        }
+        return cmd;
     }
 }
index 56d969fd2e91c663445b951488906055a173495e..5f90d92d4914282cb8e0e34d1350150203a9f52b 100644 (file)
@@ -1,5 +1,6 @@
 use std::collections::{HashMap, HashSet};
 use std::str;
+use semver::Version;
 
 use core::{SourceMap, Package, PackageId, PackageSet, Resolve, Target};
 use util;
@@ -127,7 +128,32 @@ impl<'a, 'b> Context<'a, 'b> {
         self.compilation.root_output = self.layout(KindTarget).proxy().dest().clone();
         self.compilation.deps_output = self.layout(KindTarget).proxy().deps().clone();
 
-        Ok(())
+        let env = &mut self.compilation.extra_env;
+        env.insert("CARGO_PKG_VERSION_MAJOR".to_string(),
+                   Some(pkg.get_version().major.to_string()));
+        env.insert("CARGO_PKG_VERSION_MINOR".to_string(),
+                   Some(pkg.get_version().minor.to_string()));
+        env.insert("CARGO_PKG_VERSION_PATCH".to_string(),
+                   Some(pkg.get_version().patch.to_string()));
+        env.insert("CARGO_PKG_VERSION_PRE".to_string(),
+                   pre_version_component(pkg.get_version()));
+
+        return Ok(());
+
+        fn pre_version_component(v: &Version) -> Option<String> {
+            if v.pre.is_empty() {
+                return None;
+            }
+
+            let mut ret = String::new();
+
+            for (i, x) in v.pre.iter().enumerate() {
+                if i != 0 { ret.push_char('.') };
+                ret.push_str(x.to_string().as_slice());
+            }
+
+            Some(ret)
+        }
     }
 
     fn build_requirements(&mut self, pkg: &'a Package, target: &'a Target,
index bc193617709a77ee90f38549c7be5acd22524474..40d443e3c9f9acd9d16c25be1c08fcb25b698894 100644 (file)
@@ -2,10 +2,8 @@ use std::collections::HashSet;
 use std::dynamic_lib::DynamicLibrary;
 use std::io::{fs, UserRWX};
 use std::os;
-use semver::Version;
 
 use core::{SourceMap, Package, PackageId, PackageSet, Target, Resolve};
-use util;
 use util::{CargoResult, ProcessBuilder, CargoError, human, caused_human};
 use util::{Config, internal, ChainError, Fresh, profile};
 
@@ -433,26 +431,9 @@ pub fn process<T: ToCStr>(cmd: T, pkg: &Package, cx: &Context) -> ProcessBuilder
     search_path.push(cx.layout(KindPlugin).deps().clone());
     let search_path = os::join_paths(search_path.as_slice()).unwrap();
 
-    util::process(cmd)
-        .cwd(pkg.get_root())
-        .env(DynamicLibrary::envvar(), Some(search_path.as_slice()))
-        .env("CARGO_PKG_VERSION_MAJOR", Some(pkg.get_version().major.to_string()))
-        .env("CARGO_PKG_VERSION_MINOR", Some(pkg.get_version().minor.to_string()))
-        .env("CARGO_PKG_VERSION_PATCH", Some(pkg.get_version().patch.to_string()))
-        .env("CARGO_PKG_VERSION_PRE", pre_version_component(pkg.get_version()))
-}
-
-fn pre_version_component(v: &Version) -> Option<String> {
-    if v.pre.is_empty() {
-        return None;
-    }
-
-    let mut ret = String::new();
-
-    for (i, x) in v.pre.iter().enumerate() {
-        if i != 0 { ret.push_char('.') };
-        ret.push_str(x.to_string().as_slice());
-    }
-
-    Some(ret)
+    // We want to use the same environment and such as normal processes, but we
+    // want to override the dylib search path with the one we just calculated.
+    cx.compilation.process(cmd).cwd(pkg.get_root())
+                               .env(DynamicLibrary::envvar(),
+                                    Some(search_path.as_slice()))
 }
index 318b9fecd42288e445534422b2df41cad18c43ad..29dbc9b874bab86e9e6296501053d54cc208c16f 100644 (file)
@@ -1,3 +1,10 @@
+2014-08-06
+  linux-i386 eb7c2a87b30db077f6f1c4ea724ebd0e5cc07d1c
+  linux-x86_64 1672657adb9012df2912bbb2f43466f1c6817e55
+  macos-i386 1224207bbfa9f46796940512ac8a7a9ab9f5665b
+  macos-x86_64 da4afea32d7336a0a91b8fe160d38896385d4ae2
+  winnt-i386 2b6b2efe9ec77d3d456c943bb2e54f2281309ef1
+
 2014-08-04
   linux-i386 49032ce8c5c2b94d73e298dcbdb09e0b2fbe573c
   linux-x86_64 98c83ecc7cac3765d62f5e8b19bdc506e01f3cab
index b9a3adfb9dccc0ff3c749f2fbbb6f2bdbcc20e08..aee2b4e602031a324218af3de6d29bc98055dfe0 100644 (file)
@@ -787,16 +787,12 @@ test!(crate_version_env_vars {
     let p = project("foo")
         .file("Cargo.toml", r#"
             [project]
-
             name = "foo"
             version = "0.5.1-alpha.1"
             authors = ["wycats@example.com"]
-
-            [[bin]]
-            name = "foo"
         "#)
-        .file("src/foo.rs", r#"
-            use std::os;
+        .file("src/main.rs", r#"
+            extern crate foo;
 
             static VERSION_MAJOR: &'static str = env!("CARGO_PKG_VERSION_MAJOR");
             static VERSION_MINOR: &'static str = env!("CARGO_PKG_VERSION_MINOR");
@@ -804,11 +800,19 @@ test!(crate_version_env_vars {
             static VERSION_PRE: &'static str = env!("CARGO_PKG_VERSION_PRE");
 
             fn main() {
-                println!("{}-{}-{} @ {}",
-                         VERSION_MAJOR,
-                         VERSION_MINOR,
-                         VERSION_PATCH,
-                         VERSION_PRE);
+                let s = format!("{}-{}-{} @ {}", VERSION_MAJOR, VERSION_MINOR,
+                                VERSION_PATCH, VERSION_PRE);
+                assert_eq!(s, foo::version());
+                println!("{}", s);
+            }
+        "#)
+        .file("src/lib.rs", r#"
+            pub fn version() -> String {
+                format!("{}-{}-{} @ {}",
+                        env!("CARGO_PKG_VERSION_MAJOR"),
+                        env!("CARGO_PKG_VERSION_MINOR"),
+                        env!("CARGO_PKG_VERSION_PATCH"),
+                        env!("CARGO_PKG_VERSION_PRE"))
             }
         "#);
 
@@ -817,6 +821,8 @@ test!(crate_version_env_vars {
     assert_that(
       process(p.bin("foo")),
       execs().with_stdout("0-5-1 @ alpha.1\n"));
+
+    assert_that(p.process(cargo_dir().join("cargo-test")), execs().with_status(0));
 })
 
 test!(custom_build_in_dependency {